"""
框架设计
一、设计原则
1、通用性
2、可扩展性(设计思想，面向对象设计思想)
3、分层设计，方便后续代码维护
4、软编码(代码不要写死)


二、如何设计
1、分层设计
   测试用例  ---  test_cases
     测试用例文件
   测试数据  ---  test_datas
     excel文件
   测试报告  ---  reports
     xxx.html文件
   日志收集  ---  logs
     xxx.log文件
   配置文件  ---  conf
     setting.py
   通用工具  ---  tools
     读取excel(openpyxl)
     数据库读取操作(pymysql)
     请求封装(requests)
     断言封装(接口、数据库)unittest断言
     参数替换的封装(正则、replace)
     全局变量的提取(jsonpath)
     路径处理(os)
   框架入口  ---  main.py
      用例收集
      用例执行
      测试报告
      邮件发送
2、从哪里入手写
   1、从测试用例类开始，遇到问题一个个解决，不断优化
   
三、实现思路
1、测试数据放在excel管理
2、通过数据驱动读取excel数据，放到测试用例里面去执行
3、做数据替换
   1、先找到需要替换的数据是哪些
   2、替换的参数从哪里来的
   3、通过字符串的replace方法进行参数替换
   4、替换完之后将替换后的数据转成python对象
4、断言
   1、在excel中新增字段期望结果字段(expected_data)，放期望结果字典
      {"token_type":"bearer"}
   2、要对相应结果进行二次封装，统一将返回不是json数据的转换成json数据
   3、根据expected_data中的字典key，从响应结果中获取到对应的值，创建新的字典
   4、断言：将创建好的新字段，与expected_data中的字典进行对比
   
四、文件上传接口
1、鉴权：获取登陆接口的token，塞到请求头里面去
   1、将登陆接口放在图片上传接口的前面
   2、提取token：动态获取需要替换的值，然后要放到一个全局变量里面去，在请求其他接口需要使用的时候再去拿
2、测试用例设计
   1、excel中增加字段来区分是否是文件上传接口
   2、不需要断言接口响应值，因为他返回的是字符串
   3、请求参数是特殊的数据，不用写在excel中，在请求的时候单独处理
   4、但是数据库会增加一条数据，要做数据库断言
3、requests进行二次封装：要兼容普通的请求发送，也要兼容文件或者图片上传的请求发送
   1、封装一个普通接口请求方法
   2、单独封装一个图片上传的接口
      1、处理鉴权，从登陆接口中把token提取出来，设置为全局变量，在请求图片上传接口的时候，去判断
         全局属性中是否有token，有的话就处理鉴权。
      2、图片要做参数化，图片放到项目中(跨平台)
      3、修改图片上传的请求头
      4、图片上传完成之后要把请求头修改回来
4、数据库断言的封装
   1、设置数据库断言字段(excel中设置)
       {"expected_data":1,"actual_data":"SELECT COUNT(*) FROM tz_attach_file WHERE file_path ='#file_path#'"}
   2、从接口响应结果中提取数据，替换sql语句中的数据
   3、执行sql语句获取查询结果
   4、拿查询结果与期望结果进行断言
   
5、添加产品的数据库断言
   1、产品partyCode是确认产品的唯一值，数据不能重复，在做替换的时候要注意添加产品和数据库断言使用的partyCode要一致
   2、sql语句执行的时候一定要记得输出一下sql语句

6、用户注册
   1、生成一个手机号，去数据库查询，确保手机号未注册，将手机号设置为全局变量
   2、触发短信，发送短信验证码
   3、校验短信验证码(请求参数的手机号要与之前触发发送短信验证码的手机号要一致)
   
7、支付流程
   1、下单：登陆成功 --- 获取秒杀地址 --- 创建订单 --- 提交订单 --- 下单
   2、支付：前端展示下单接口返回的二维码 --- 用户微信扫码支付 --- 请求由微信发给微信的后端 --- 微信后端要通知我们服务端支付结果(回调)
   3、模拟回到：实际上我并没有用微信扫码支付，但是我要测试到订单的各种状态(支付成功、支付失败)，因此就要模拟微信通知我们服务端支付结果(回调)
      我们用脚本调 --- 【开发写一个接口调自己的接口(回调接口)，模拟微信的回调参数进行回调】
      自己写一个方法去回调后端的回调接口(微信回调的接口) 
      多线程(IO密集型任务)、多进程(cpu密集型任务)

测试原则：
1、不会偷懒的测试不是好测试：技术不行，没办法偷懒
2、复杂的事情简单化，简单的事情自动化
3、财务报表(30多个计算公式)


秒杀订单怎么测试
功能测试
1、边界值(金额、时间、库存)
2、下单的落库情况
3、幂等性(重复下单)
4、限购(用户维度)
5、抢库存(并发2笔，看谁成交，成交顺序逻辑，锁库存)
6、在规定时间内没有支付(取消订单之后，库存是否恢复)
7、模拟回调(模拟第三方支付回调，状态处理逻辑是否正确)
8、主动查询(查询对应订单状态，状态处理逻辑是否正确)

安全性
1、数据权限
2、越权
3、传输的数据安全，是否加密传输(RSA)
4、日志脱敏处理
6、交易日志要保留30年(不可抵赖性)

性能(多线程并发，jmeter并发)
1、支持多人同时下单
2、要限制每一秒并发数(6次)
3、每一秒同一个ip请求次数(6次)


def test01():
    data = 模拟回调
    test03(data)

def test02():
    data = 主动查询
    test03(data)
"""



